package modes

import (
	"time"
)

// 问题项目类型
type DictNSO struct {
	Id    int    `json:"id"`    // key
	Val   string `json:"val"`   // value
	Order int    `json:"order"` // order 排序值
}

// 问题类型配置
var QTypes = []DictNSO{
	{1, "历年真题", 1},
	{2, "备考指南", 2},
	{3, "章节练习", 3},
	{5, "院校咨询", 5},
	{6, "考前预测卷", 6},
	{7, "教材", 7},
	{8, "课程", 8},
	{9, "其他", 9},
}
var mapQTypes = map[int]*DictNSO{}

func init() {
	for i := 0; i < len(QTypes); i++ {
		mapQTypes[QTypes[i].Id] = &QTypes[i]
	}
}
func QTypeName(id int) string {
	val, ok := mapQTypes[id]
	if !ok {
		return ""
	}
	return val.Val
}

// 回答类型
type EAnswer int32 //
const (
	EAnswer_Reply EAnswer = iota + 1 // 回复
	EAnswer_ReAsk                    // 追问
	EAnswer_Max
)

/*------------------------------------------------------------------------------
======================================问题=======================================
------------------------------------------------------------------------------*/
type Question struct {
	Id      int64    `json:"id" xorm:"pk autoincr 'id'"`                    // 问题Id
	SId     int64    `json:"sid" xorm:"notnull index 'sid'"`                // 学员Id
	Title   string   `json:"title" xorm:"varchar(128) notnull 'title'"`     // 标题
	PId     int64    `json:"pid" xorm:"notnull 'pid'"`                      // 项目Id
	QType   int32    `json:"qtype" xorm:"notnull 'qtype'"`                  // 问题类型
	Content string   `json:"content" xorm:"varchar(512) notnull 'content'"` // 内容
	PicUrls []string `json:"pic_urls" xorm:"'pic_urls'"`                    // 图片的url
	AskAt   int64    `json:"ask_at" xorm:"notnull 'ask_at'"`                // 最后提问时间
	RepAt   int64    `json:"rep_at" xorm:"notnull 'rep_at'"`                // 最后回复时间
	HasRepl int32    `json:"replied" xorm:"notnull 'replied'"`              // 回复状态(1:未回复,2:已回复)
	HasNews int32    `json:"has_news" xorm:"notnull 'has_news'"`            // 是否有新回复(1:没;2:有)
	At      int64    `json:"at" xorm:"notnull index 'at'"`                  // 创建时间
}
type QuestionProj struct {
	StudentInfo `xorm:"extends"`
	Question    `xorm:"extends"`
	Project     `xorm:"extends"`
}

func (this *Question) TableName() string { return "question" }

func (this *Question) Get() error {
	_, err := Db(0).ID(this.Id).Get(this)
	return err
}

// Question.Insert 添加一条新问题
func (this *Question) Insert() (int64, error) {
	now := time.Now().Unix()

	this.AskAt, this.HasRepl = now, 1
	this.HasNews, this.At = 1, now
	return Db(0).Insert(this)
}

// Question.NewsNum 有新回复的问题数量
func (this *Question) NewsNum() (int64, error) {
	this.HasNews = 2
	return Db(0).Count(this)
}

// Question.ClrNews 已阅
func (this *Question) ClrNews() (int64, error) {
	return Db(0).Where("sid=?", this.SId).Update(&Question{HasNews: 1})
}

// Question.ReAsked 追问
func (this *Question) ReAsked() error {
	_, err := Db(0).ID(this.Id).Update(&Question{AskAt: time.Now().Unix(), HasRepl: 1})
	return err
}

// Question.MineList 我的问题列表
func (this *Question) MineList(page *PageFields) (int64, []QuestionProj, error) {
	var ques []QuestionProj

	tbl := Db(0).Table("studen_info").
		Join("INNER", "question", "question.sid = studen_info.id").
		Join("INNER", "project", "question.pid = project.id").
		Where("question.sid = ?", this.SId)

	total, err := tbl.Clone().Count()
	if err != nil {
		return 0, nil, err
	}

	page.Page--
	if err := tbl.Desc("question.at").Limit(page.Pnum, page.Page*page.Pnum).Find(&ques); err != nil {
		return 0, nil, err
	}

	return total, ques, nil
}

/*------------------------------------------------------------------------------
======================================回答======================================
------------------------------------------------------------------------------*/

type Answered struct {
	Id      int64    `json:"id" xorm:"pk autoincr 'id'"`                     // 主键
	QId     int64    `json:"qid" xorm:"notnull index 'qid'"`                 // 归属问题Id
	AType   EAnswer  `json:"atype" xorm:"notnull 'atype'"`                   // 答复类型
	SId     int64    `json:"sid" xorm:"notnull index 'sid'"`                 // 学员Id
	TId     int64    `json:"tid" xorm:"notnull index 'tid'"`                 // 坐席Id
	TName   string   `json:"tname" xorm:"varchar(32) notnull 'tname'"`       // 坐席名
	Content string   `json:"content" xorm:"varchar(1000) notnull 'content'"` // 内容
	PicUrls []string `json:"pic_urls" xorm:"varchar(512) 'pic_urls'"`        // 图片的url [新增]
	UpdAt   int64    `json:"upd_at" xorm:"notnull 'upd_at'"`                 // 更新时间
	At      int64    `json:"at" xorm:"notnull index 'at'"`                   // 创建时间
}

func (this *Answered) TableName() string { return "answered" }
func (this *Answered) Get() error {
	_, err := Db(0).ID(this.Id).Get(this)
	return err
}

// Answered.Insert 添加新的回复
func (this *Answered) Insert(e EAnswer) (int64, error) {
	now := time.Now().Unix()
	this.AType, this.UpdAt, this.At = e, now, now
	return Db(0).Insert(this)
}

// Answered.Replys 根据问题ID获得所有回复记录
func (this *Answered) Replys(qids ...int64) ([]Answered, error) {
	var ans []Answered

	err := Db(0).Table(this).In("qid", qids).Asc("at").Find(&ans)
	return ans, err
}
